package com.zyf.chapter02.behavior.strategy.sort.file.v3;

import com.zyf.chapter02.behavior.strategy.sort.file.v2.*;

import java.io.File;

/**
 * 将算法的具体逻辑拆分
 * 通过工厂类，使得每个排序算法只需要创建一次实例
 * <p/> 优化点：还是存在 if else 判断
 * @author yifeng
 */
public class Sorter {
    private static final long GB = 1000 * 1000 * 1000;

    public void sortFile(String filePath) {
        // 省略校验逻辑
        File file = new File(filePath);
        long fileSize = file.length();
        ISortAlg sortAlg;
        // 将文件大小划分为 4 个区间，根据区间分别使用不同的算法
        if (fileSize < 6 * GB) { // [0, 6GB]
            sortAlg = SortAlgFactory.getSortAlg("QuickSort");
        } else if (fileSize < 10 * GB) { // [6GB, 10GB]
            sortAlg = SortAlgFactory.getSortAlg("ExternalSort");
        } else if (fileSize < 100 * GB) { // [10GB, 100GB]
            sortAlg = SortAlgFactory.getSortAlg("ConcurrentExternalSort");
        } else { // [100GB, ~]
            sortAlg = SortAlgFactory.getSortAlg("MapReduceSort");
        }
        sortAlg.sort(filePath);
    }
}
